package cn.tedu.store.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

/**
 * 切面组件
 * @author Lenovo
 *
 */
@Component
@Aspect
public class DemoAspect {
	//来自AspectJ的注解
	//在userService的全部方法之前执行
	//切面组件的demo方法
	@Before(value = "bean(userService)")
	public void demo() {
		System.out.println("Hello world!");
	}
	//在目标方法之后执行切面方法，无论是否有异常，
	//都执行。 @AfterReturning 在方法正常结束以后
	//@AfterThrow在方法出现异常以后
	@After(value="bean(userService)")
	public void test1() {
		System.out.println("test1");
	}
	//环绕通知
	//1 方法必须有返回值
	//2 方法必须有参数ProceedingJoinPoint 处理连接点
	//3 在方法中调用jp.proceed()就是在执行目标的业务方法
	//返回值就是目标方法的执行结果
	//4 jp.proceed() 方法执行出现异常，就是目标业务方法执行
	//期间出现异常
	//此方式可以包含之前5种方式 	
	@Around("bean(userService)")
	public Object test4(ProceedingJoinPoint jp) throws Throwable {
		Object val=jp.proceed();
		return val;
	}
}
